행렬에는 곱셈, 전치 이외에도 지수 함수 등의 다양한 연산을 정의할 수 있다. 각각의 정의와 성질을 알아보자.
행렬은 복수의 실수 값을 가지고 있으므로 행렬 전체의 부호는 정의할 수 없다. 하지만 행렬에서도 실수의 부호 정의와 유사한 기능을 가지는 정의가 존재한다. 바로 행렬의 양-한정(positive definite) 특성이다.
모든 실수 공간 $\mathbb{R}^n$ 의 0벡터가 아닌 벡터 $x \in \mathbb{R}^n$ 에 대해 다음 부등식이 성립하면 행렬 $A$ 가 양-한정(positive definite)이라고 한다.
$$ x^T A x > 0 $$만약 이 식이 등호를 포함한다면 양-반한정(positive semi-definite)이라고 한다.
$$ x^T A x \geq 0 $$예를 들어 단위 행렬은 양-한정이다.
$$ x^TI x = x^T \begin{bmatrix} 1&0&\cdots&0\\ 0&1&\cdots&0\\ \vdots&\vdots&\ddots&\vdots\\ 0&0&\cdots&1\\ \end{bmatrix} x = x_1^2 + x_2^2 + \cdots + x_n^2 > 0 $$다음과 같은 행렬도 양-한정이다.
$$ M = \begin{bmatrix} 2&-1&0\\-1&2&-1\\0&-1&2 \end{bmatrix} $$행렬에는 크기 개념과 유사하게 하나의 행렬에 대해 하나의 실수를 대응시키는 norm, 대각 성분(trace), 행렬식(determinant)에 대한 정의가 존재한다.
행렬의 norm 정의는 다양하지만 그 중 많이 쓰이는 induced p-norm 정의는 다음과 같다.
$$ \Vert A \Vert_p = \left( \sum_{i=1}^m \sum_{j=1}^n |a_{ij}|^p \right)^{1/p} $$이 중 $p=2$는 특별히 Frobenius norm 이라고 불리며 다음과 같이 표시한다.
$$ \Vert A \Vert_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n a_{ij}^2} $$NumPy에서는 linalg 서브패키지의 norm
명령으로 Frobenious norm을 계산할 수 있다.
In [5]:
A = (np.arange(9) - 4).reshape((3, 3))
A
Out[5]:
In [6]:
np.linalg.norm(A)
Out[6]:
대각 성분(trace) 행렬의 특성을 결정하는 숫자 중 하나로 정방 행렬(square matrix)에 대해서만 정의되며 다음과 같이 대각 성분(diaginal)의 합으로 계산된다.
$$ \operatorname{tr}(A) = a_{11} + a_{22} + \dots + a_{nn}=\sum_{i=1}^{n} a_{ii} $$대각 성분은 다음과 같은 성질을 지닌다.
$$ \text{tr} (cA) = c\text{tr} (A) $$$$ \text{tr} (A^T) = \text{tr} (A) $$$$ \text{tr} (A + B) = \text{tr} (A) + \text{tr} (B)$$$$ \text{tr} (AB) = \text{tr} (BA) $$$$ \text{tr} (ABC) = \text{tr} (BCA) = \text{tr} (CAB) $$특히 마지막 성질은 trace trick이라고 하여 이차 형식(quadratic form)의 값을 구하는데 유용하게 사용된다.
$$ x^TAx = \text{tr}(x^TAx) = \text{tr}(Axx^T) = \text{tr}(xx^TA) $$NumPy에서는 linalg 서브패키지의 trace
명령으로 trace를 계산할 수 있다.
NumPy에서는 linalg 서브패키지의 trace
명령으로 trace를 계산할 수 있다.
In [7]:
np.trace(np.eye(3))
Out[7]:
정방 행렬 $A$의 행렬식(determinant) $\det (A)$ 는 Laplace formula라고 불리는 재귀적인 방법으로 정의된다.
이 식에서 $a_{i,j}$는 $A$의 i행, j열 원소이고 $M_{i,j}$은 정방 행렬 $A$ 에서 i행과 j열을 지워서 얻어진 행렬의 행렬식이다.
$$ \det(A) = \sum_{j=1}^n (-1)^{i+j} a_{i,j} M_{i,j} $$행렬식은 다음과 같은 성질을 만족한다.
$$ \det(I) = 1 $$$$ \det(A^{\rm T}) = \det(A) $$$$ \det(A^{-1}) = \frac{1}{\det(A)}=\det(A)^{-1} $$$$ \det(AB) = \det(A)\det(B) $$$$ A \in \mathbf{R}^n \;\;\; \rightarrow \;\;\; \det(cA) = c^n\det(A) $$또한 역행렬은 행렬식과 다음과 같은 관계를 가진다.
$$ A^{-1} = \dfrac{1}{\det A} M = \dfrac{1}{\det A} \begin{bmatrix} M_{1,1}&\cdots&M_{1,n}\\ \vdots&\ddots&\vdots\\ M_{n,1}&\cdots&M_{n,n}\\ \end{bmatrix} $$NumPy에서는 linalg 서브패키지의 det
명령으로 trace를 계산할 수 있다.
In [8]:
A = np.array([[1, 2], [3, 4]])
A
Out[8]:
In [9]:
np.linalg.det(A)
Out[9]:
전치 연산을 통해서 얻어진 행렬을 전치 행렬(transpose matrix)이라고 한다.
$$ [\mathbf{A}^\mathrm{T}]_{ij} = [\mathbf{A}]_{ji} $$만약 전치 행렬과 원래의 행렬이 같으면 대칭 행렬(symmetric matrix)이라고 한다.
$$ A^\mathrm{T} = A $$전치 연산은 다음과 같은 성질을 만족한다.
$$ ( A^\mathrm{T} ) ^\mathrm{T} = A $$$$ (A+B) ^\mathrm{T} = A^\mathrm{T} + B^\mathrm{T} $$$$ \left( A B \right) ^\mathrm{T} = B^\mathrm{T} A^\mathrm{T} $$$$ \det(A^\mathrm{T}) = \det(A) $$$$ (A^\mathrm{T})^{-1} = (A^{-1})^\mathrm{T} $$행렬 $A$에 대해 다음과 같은 급수로 만들어지는 행렬 $e^A=\exp A$ 를 지수 행렬(exponential matrix)이라고 한다.
$$ e^X = \sum_{k=0}^\infty \dfrac{X^k}{k!} = I + X + \dfrac{1}{2}X^2 + \dfrac{1}{3!}X^3 + \cdots $$지수 행렬은 다음과 같은 성질을 만족한다.
$$ e^0 = I $$$$ e^{aX} e^{bX} = e^{(a+b)X} $$$$ e^X e^{-X} = I $$$$ XY = YX \;\; \rightarrow \;\; e^Xe^Y = e^Ye^X = e^{X+Y} $$행렬 $A$에 대해 다음과 같은 급수로 만들어지는 행렬 $B=e^A$ 가 존재할 때, $A$를 $B$에 대한 로그 행렬이라고 하고 다음과 같이 표기한다.
$$ A = \log B $$로그 행렬은 다음과 같은 성질은 만족한다.
만약 행렬 $A$, $B$가 모두 양-한정(positive definite)이고 $AB=BA$이면
$$ AB = e^{\ln(A)+\ln(B)} $$만약 행렬 $A$의 역행렬이 존재하면
$$ A^{-1} = e^{-\ln(A)} $$지수 행렬이나 로그 행렬은 NumPy에서 계산할 수 없다. SciPy의 linalg 서브패키지의 expm
, logm
명령을 사용한다.
In [20]:
A = np.array([[1.0, 3.0], [1.0, 4.0]])
A
Out[20]:
In [21]:
B = sp.linalg.logm(A)
B
Out[21]:
In [22]:
sp.linalg.expm(B)
Out[22]: